home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok46.lha / Module / IntuitionObjekte.def < prev    next >
Text File  |  1993-08-15  |  14KB  |  378 lines

  1. (*
  2.  * --------------------------------------------------------------------------
  3.  *     :Program.    IntuitionObjekte.def
  4.  *     :Contents.    komplexe Intuition-Gadgets mit Unterstützung.
  5.  *     :Author.    Reiner Nix
  6.  *     :Adress.    Geranienhof 2, 5000 Köln 71 Seeberg
  7.  *     :Language.    Modula-2
  8.  *     :Translator.    M2Amiga AMSoft, Version 3.3d
  9.  *     :History.    V1.1  (privat)        ;nur für ein Fenster
  10.  *     :History.    V1.2  19.Februar.90    ;für mehrere Fenster
  11.  *
  12.  *
  13.  * PRIVAT:    Window^.userData  := FensterInfoPtr;
  14.  * PRIVAT:    Gadget^.userData  := ObjektPtr;
  15.  * PRIVAT:     Diese Zeiger dürfen NICHT geändert werden!
  16.  *
  17.  * WICHTIG:    Für ein einfaches Eingabeobjekt "string" muß der Eingabetext
  18.  * WICHTIG:     EingabeLaenge + 2 lang sein:
  19.  * WICHTIG:     EingabeLaenge + Leerzeichen + Nullbyte zum Abschluß,
  20.  * WICHTIG:     das Leerzeichen wird intern benutzt, das Nullbyte wird
  21.  * WICHTIG:     nötigenfalls angefügt.
  22.  *
  23.  * --------------------------------------------------------------------------
  24.  *)
  25.  
  26. DEFINITION MODULE IntuitionObjekte;
  27.  
  28. FROM    SYSTEM        IMPORT    FFP, LONGSET;
  29. FROM    Graphics    IMPORT    FontStyleSet;
  30. FROM    Intuition    IMPORT    IDCMPFlagSet, GadgetFlagSet,
  31.                 WindowPtr, GadgetPtr, IntuiMessage;
  32.  
  33. TYPE    ObjektPtr;
  34.  
  35. (*
  36.  * --------------------------------------------------------------------------
  37.  * RandTyp    verschiedene Ränder sind zur Zeit noch nicht implementiert,
  38.  *         aber so etwas, wie gewisse Standardränder soll mal kommen.
  39.  * --------------------------------------------------------------------------
  40.  *)
  41.     RandTyp        =(einfach, rund, perspekive);
  42.  
  43.  
  44. (*
  45.  * --------------------------------------------------------------------------
  46.  * Gegenstand des Moduls sind komplexe Intuition-Gadgets, hier Objekte genannt,
  47.  * die Objekte sollen je nach Typ unterschiedliche Ereignisse gemeldet
  48.  * bekommen und dann in einer dem Objekt verbundenen Aktion verarbeiten.
  49.  *
  50.  * ObjektTypen:
  51.  *  wechseln    mögliche Ereignisse sind "An" und "Aus".
  52.  *  melden    mögliches Ereigniss ist "Treffer"
  53.  *  wiederholen mögliche Ereignisse sind "Start", "Wiederholung", "Ende".
  54.  *        Es wird mit Mausdruck das Ereignis "Start" gesendet, danach
  55.  *        wird solange (je IntuiTick) "Wiederholung" gesendet bis das
  56.  *        der Mausknopf losgelassen wird, was mit "Ende" gemeldet wird.
  57.  *  eingeben    mögliche Ereignisse sind "Start", "Wiederholung", "Ende",
  58.  *        "Eingabe", "SonderEingabe". Wird das Objekt aktiviert, so
  59.  *        wird "Start" gesendet, bei Neupositionierung des Cursors mit
  60.  *        der Maus wird "Wiederholung" gesendet, soll das Objekt seine
  61.  *        Aktion abschließen (da ein anderes aktiviert werden soll) wird
  62.  *        "Ende" gesendet. "Eingabe" und "SonderEingabe" melden ein-
  63.  *        getroffende Vanilla- oder Raw-Zeichen.
  64.  * --------------------------------------------------------------------------
  65.  *)
  66.     ObjektTyp    =(wechseln, melden, wiederholen, eingeben);
  67.     BooleanTyp    =ObjektTyp [wechseln..wiederholen];
  68.     ProportionalTyp =ObjektTyp [melden..wiederholen];
  69.  
  70.     ObjektEreignis    =(Treffer, An, Aus, Start, Wiederholung, Ende,
  71.               Eingabe, SonderEingabe);
  72.  
  73.     ObjektEnde    =(returnEnde, pfeilEnde, externEnde);
  74.  
  75.  
  76. (*
  77.  * --------------------------------------------------------------------------
  78.  * ObjektAktion ist die Procedure, die bei Eintreffen eines passenden
  79.  *        Ereignisses aktiviert wird. Damit mit einer Aktion mehrere
  80.  *        gleich zu behandelnde Objekte versorgt werden können, wird
  81.  *        ebenfalls ein Zeiger aus das Objekt weitergegeben.
  82.  *        Bei Eingabeobjekten ist als Procedure "standardTextAktion"
  83.  *        eingestellt.
  84.  * --------------------------------------------------------------------------
  85.  *)
  86.     ObjektAktion    =PROCEDURE (    ObjektEreignis, (* Ereignis *)
  87.                     ObjektPtr);    (* objekt *)
  88.  
  89.  
  90. (*
  91.  * --------------------------------------------------------------------------
  92.  * PruefeEingabe bei einem Eingabeobjekt werden die Ereignisse schon über
  93.  *         "standardtextAktion" behandelt, deswegen ist die Möglichkeit
  94.  *         gegeben die eingegebenen Daten auf Korrektheit zu prüfen.
  95.  *         Fällt die Prüfung negativ aus (FALSE), so wird die Eingabe
  96.  *         nicht beendet, das Objekt bleibt aktiv.
  97.  * --------------------------------------------------------------------------
  98.  *)
  99.     PruefeEingabe    =PROCEDURE (    ObjektPtr) :BOOLEAN;
  100.  
  101.  
  102. (*
  103.  * --------------------------------------------------------------------------
  104.  * EingabeOk    soll bei eine, Eingabeobjekt keine Prüfung erfolgen, so ist
  105.  *        die Dummy-Procedure EingabeOk anzugeben. Ihr Wert ist immer
  106.  *        gleich TRUE.
  107.  * --------------------------------------------------------------------------
  108.  *)
  109. PROCEDURE EingabeOk        (    objekt        :ObjektPtr) :BOOLEAN;
  110.  
  111.  
  112. (*
  113.  * --------------------------------------------------------------------------
  114.  * setzeXXX        Voreinstellungen, die für die nachfolgend erzeugten
  115.  *            Objekte benutzt werden.
  116.  * setzeAusrichtung    Einstellung für relative Objektgröße und -position,
  117.  *            z.B. YrelHoehe.
  118.  * setzeGadgetTyp    z.B. für gzzGadget, normales Objekt = 0.
  119.  * setzeTextZeichensatz öffnet Zeichensatz und bereitet ihn zur automatischen
  120.  *            Benutzung vor.
  121.  * setzeEingabeZeichen. wir setzteTextZeichensatz, jedoch darf kein
  122.  *            proportionaler zeichensatz benutzt werden.
  123.  * --------------------------------------------------------------------------
  124.  *)
  125. PROCEDURE setzeTextFarbe    (    Vorne, Hinten    :INTEGER);
  126. PROCEDURE setzeRandFarbe    (    Vorne, Hinten    :INTEGER);
  127. PROCEDURE setzeEingabeFarbe    (    Vorne, Hinten    :INTEGER);
  128. PROCEDURE setzeLinienFarbe    (    Vorne, Hinten    :INTEGER);
  129. PROCEDURE setzeRand        (    neuerRand        :RandTyp);
  130. PROCEDURE setzeAusrichtung    (    neueAusrichtung    :GadgetFlagSet);
  131. PROCEDURE setzeGadgetTyp    (    neuerTyp        :CARDINAL);
  132.  
  133. PROCEDURE setzeTextZeichensatz    (    Name        :ARRAY OF CHAR;
  134.                      Groesse        :CARDINAL;
  135.                      Stil        :FontStyleSet);
  136.  
  137. PROCEDURE setzeEingabeZeichensatz (  Name        :ARRAY OF CHAR;
  138.                      Groesse        :CARDINAL;
  139.                      Stil        :FontStyleSet);
  140.  
  141. (*
  142.  * --------------------------------------------------------------------------
  143.  * setzeBenutzterIDCMP    da für die Objekte ebenfalls gewisse, sich ändernde
  144.  *            IDCMP-Flags nötig sind sollte ein Benutzter den
  145.  *            IDCMP nicht direkt verändern, sondern über die
  146.  *            Procedure setzeBenutzterIDCMP. Man muß darauf einge-
  147.  *            stellt sein, das auch nicht angeforderte Events
  148.  *            ankommen (eben für die Objekte) und diese ignorieren.
  149.  * --------------------------------------------------------------------------
  150.  *)
  151. PROCEDURE setzeBenutzerIDCMP    (    Fenster        :WindowPtr;
  152.                      BenutzerFlags    :IDCMPFlagSet);
  153.  
  154. (*
  155.  * --------------------------------------------------------------------------
  156.  * loescheObjekte    Das spezifizierte Objekt wird mitsamt seiner
  157.  *            verbundenen Strukturen entfernt.
  158.  * loescheAlleObjekte    wie oben, jedoch für alle Objekte dieses Fensters.
  159.  *
  160.  * ACHTUNG:    Da die Objekte nicht nur für sich allein stehen, sondern
  161.  *        in Abhängikeit zu verschiedenen Zusatzinformationen sind, kann
  162.  *        man diese nicht ohne weiteres ändern. Man benutze hierzu die
  163.  *        Zugriffsfunktionen oder sei sich anhand des Implementations-
  164.  *        moduls sicher, daß keine unerwünschten Beeinflussungen
  165.  *        erfolgen.
  166.  *        Insbesondere wird über Fenster.userData und Gadget.userData
  167.  *        auf Zusatzstrukturen verwiesen, die alle für das Fenster /
  168.  *        Objekt speziellen Daten enthalten.
  169.  *        Die benutzten Fenster müßen also mindestens solange geöffnet
  170.  *        bleiben, wie dafür Objekte existieren.
  171.  * --------------------------------------------------------------------------
  172.  *)
  173. PROCEDURE loescheObjekt        (    objekt        :ObjektPtr);
  174.  
  175. PROCEDURE loescheAlleObjekte    (    Fenster        :WindowPtr);
  176.  
  177.  
  178. (*
  179.  * --------------------------------------------------------------------------
  180.  * findeObjekt        gibt einen Zeiger auf das erste Objekt mit dieser
  181.  *            Nummer wieder; NIL falls nicht vorhanden.
  182.  * verbindeObjekte    verkettet schon angelegte Textobjekte miteinander,
  183.  *            damit die Pfeiltasten benutzbar sind. Soll keine
  184.  *            Verbindung in eine Richtung entstehen ist eine
  185.  *            unbenutzte Objektnummer anzugeben.
  186.  * --------------------------------------------------------------------------
  187.  *)
  188. PROCEDURE findeObjekt        (    Fenster        :WindowPtr;
  189.                      Nummer        :INTEGER) :ObjektPtr;
  190.  
  191. PROCEDURE verbindeObjekte    (    Fenster        :WindowPtr;
  192.                      ObjektNr,
  193.                      obererNachbar,
  194.                      untererNachbar,
  195.                      rechterNachbar,
  196.                      linkerNachbar    :INTEGER);
  197.  
  198.  
  199. (*
  200.  * --------------------------------------------------------------------------
  201.  * aenderInfoSatz    ändert den Infosatz des Objektes und gibt ihn aus.
  202.  *            Die Länge wird beibehalten, also gefüllt oder gekürzt.
  203.  * erneuerObjekt    Wenn bei einem Eingabeobjekt die Eingabedate geändert
  204.  *            wurde muß mit erneuerObjekt diese in die internen
  205.  *            Strukturen übernommen und gezeichnet werden.
  206.  * erneuerObjekte    wie oben, wirkt direkt auf viele.
  207.  * ACHTUNG:        Der Cursor darf beim erneuern nicht auf das Objekt
  208.  * ACHTUNG:        gesetzt sein.
  209.  * --------------------------------------------------------------------------
  210.  *)
  211. PROCEDURE aenderInfoSatz    (    objekt        :ObjektPtr;
  212.                      Text        :ARRAY OF CHAR);
  213.  
  214. PROCEDURE erneuerObjekt        (    objekt        :ObjektPtr);
  215.  
  216. PROCEDURE erneuerObjekte    (    Fenster        :WindowPtr;
  217.                      Objekte        :LONGSET);
  218.  
  219.  
  220. (*
  221.  * --------------------------------------------------------------------------
  222.  * verarbeiteNachricht    verarbeitet alle IntuiMessages die Objekte betreffen
  223.  *            zu Ereignissen und ruft die entsprechenden
  224.  *            ObjektAktionen auf. Die Message wird nicht verändert,
  225.  *            unbekannte Events werden ignoriert.
  226.  * --------------------------------------------------------------------------
  227.  *)
  228. PROCEDURE verarbeiteNachricht    (    Fenster        :WindowPtr;
  229.                  VAR Nachricht        :IntuiMessage);
  230.  
  231. PROCEDURE frageObjektNr        (    objekt        :ObjektPtr) :INTEGER;
  232. PROCEDURE frageGadget        (    objekt        :ObjektPtr) :GadgetPtr;
  233. PROCEDURE frageHPosition    (    objekt        :ObjektPtr) :CARDINAL;
  234. PROCEDURE frageVPosition    (    objekt        :ObjektPtr) :CARDINAL;
  235. PROCEDURE frageEnde        () :ObjektEnde;
  236.  
  237. PROCEDURE setzeHPosition    (    objekt        :ObjektPtr;
  238.                      Position,
  239.                      MaxPosition    :CARDINAL);
  240.  
  241. PROCEDURE setzeVPosition    (    objekt        :ObjektPtr;
  242.                      Position,
  243.                      MaxPosition    :CARDINAL);
  244.  
  245. PROCEDURE setzeHVPosition    (    objekt        :ObjektPtr;
  246.                      HPosition,
  247.                      VPosition,
  248.                      HMaxPosition,
  249.                      VMaxPosition    :CARDINAL);
  250.  
  251.  
  252. (*
  253.  * --------------------------------------------------------------------------
  254.  * erzeugeXXX    erzeugt entsprechendes Objekt, bindet es ein und erzeugt direkt
  255.  *        eine Ausgabe im Fenster.
  256.  *        Bei Eingabeobjekten wird intern eine Referenz auf die
  257.  *        Eingabevariable gesetzt, so das die Variable mindestens
  258.  *        genau solange wie das Objekt existent sein muß.
  259.  * --------------------------------------------------------------------------
  260.  *)
  261. PROCEDURE erzeugeBooleanObjekt    (    Fenster        :WindowPtr;
  262.                      X,Y        :INTEGER;
  263.                      Text        :ARRAY OF CHAR;
  264.                      Nummer        :INTEGER;
  265.                      Typ        :BooleanTyp;
  266.                      EreignisAktion    :ObjektAktion);
  267.  
  268. PROCEDURE erzeugeHPropObjekt    (    Fenster        :WindowPtr;
  269.                      X,Y,
  270.                      Breite,Hoehe    :INTEGER;
  271.                      Position,
  272.                      MaxPosition    :CARDINAL;
  273.                      Nummer        :INTEGER;
  274.                      Typ        :ProportionalTyp;
  275.                      EreignisAktion     :ObjektAktion);
  276.  
  277. PROCEDURE erzeugeVPropObjekt    (    Fenster        :WindowPtr;
  278.                      X,Y,
  279.                      Breite,Hoehe    :INTEGER;
  280.                      Position,
  281.                      MaxPosition    :CARDINAL;
  282.                      Nummer        :INTEGER;
  283.                      Typ        :ProportionalTyp;
  284.                      EreignisAktion     :ObjektAktion);
  285.  
  286. PROCEDURE erzeugeHVPropObjekt   (    Fenster        :WindowPtr;
  287.                      X,Y,
  288.                      Breite,Hoehe    :INTEGER;
  289.                      HPosition,
  290.                      VPosition,
  291.                      HMaxPosition,
  292.                      VMaxPosition    :CARDINAL;
  293.                      Nummer        :INTEGER;
  294.                      Typ        :ProportionalTyp;
  295.                      EreignisAktion     :ObjektAktion);
  296.  
  297. PROCEDURE erzeugeTextObjekt    (    Fenster        :WindowPtr;
  298.                      X,Y        :INTEGER;
  299.                      Text        :ARRAY OF CHAR;
  300.                      Nummer,
  301.                      xText,yText    :INTEGER;
  302.                      DisplayLaenge,
  303.                      EingabeLaenge    :CARDINAL;
  304.                      EingabeOK        :PruefeEingabe;
  305.                  VAR EingabeSatz    :ARRAY OF CHAR);
  306.  
  307. PROCEDURE erzeugeCardObjekt    (    Fenster        :WindowPtr;
  308.                      X,Y        :INTEGER;
  309.                      Text        :ARRAY OF CHAR;
  310.                      Nummer,
  311.                      xText,yText    :INTEGER;
  312.                      EingabeLaenge    :CARDINAL;
  313.                      EingabeOK        :PruefeEingabe;
  314.                  VAR EingabeZahl    :CARDINAL);
  315.  
  316. PROCEDURE erzeugeLongCardObjekt    (    Fenster        :WindowPtr;
  317.                      X,Y        :INTEGER;
  318.                      Text        :ARRAY OF CHAR;
  319.                      Nummer,
  320.                      xText,yText    :INTEGER;
  321.                      EingabeLaenge    :CARDINAL;
  322.                      EingabeOK        :PruefeEingabe;
  323.                  VAR EingabeZahl    :LONGCARD);
  324.  
  325. PROCEDURE erzeugeIntObjekt    (    Fenster        :WindowPtr;
  326.                      X,Y        :INTEGER;
  327.                      Text        :ARRAY OF CHAR;
  328.                      Nummer,
  329.                      xText,yText    :INTEGER;
  330.                      EingabeLaenge    :CARDINAL;
  331.                      EingabeOK        :PruefeEingabe;
  332.                  VAR EingabeZahl    :INTEGER);
  333.  
  334. PROCEDURE erzeugeLongIntObjekt    (    Fenster        :WindowPtr;
  335.                      X,Y        :INTEGER;
  336.                      Text        :ARRAY OF CHAR;
  337.                      Nummer,
  338.                      xText,yText    :INTEGER;
  339.                      EingabeLaenge    :CARDINAL;
  340.                      EingabeOK        :PruefeEingabe;
  341.                  VAR EingabeZahl    :LONGINT);
  342.  
  343. PROCEDURE erzeugeRealObjekt    (    Fenster        :WindowPtr;
  344.                      X,Y        :INTEGER;
  345.                      Text        :ARRAY OF CHAR;
  346.                      Nummer,
  347.                      xText,yText    :INTEGER;
  348.                      EingabeLaenge,
  349.                      NachkommaStellen    :CARDINAL;
  350.                      Exponent        :BOOLEAN;
  351.                      EingabeOK        :PruefeEingabe;
  352.                  VAR EingabeZahl    :REAL);
  353.  
  354. PROCEDURE erzeugeLongRealObjekt    (    Fenster        :WindowPtr;
  355.                      X,Y        :INTEGER;
  356.                      Text        :ARRAY OF CHAR;
  357.                      Nummer,
  358.                      xText,yText    :INTEGER;
  359.                      EingabeLaenge,
  360.                      NachkommaStellen    :CARDINAL;
  361.                      Exponent        :BOOLEAN;
  362.                      EingabeOK        :PruefeEingabe;
  363.                  VAR EingabeZahl    :LONGREAL);
  364.  
  365. PROCEDURE erzeugeFFPObjekt    (    Fenster        :WindowPtr;
  366.                      X,Y        :INTEGER;
  367.                      Text        :ARRAY OF CHAR;
  368.                      Nummer,
  369.                      xText,yText    :INTEGER;
  370.                      EingabeLaenge,
  371.                      NachkommaStellen    :CARDINAL;
  372.                      Exponent        :BOOLEAN;
  373.                      EingabeOK        :PruefeEingabe;
  374.                  VAR EingabeZahl    :FFP);
  375.  
  376.  
  377. END IntuitionObjekte.
  378.